Guest User

Untitled

a guest
Dec 26th, 2017
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.71 KB | None | 0 0
  1.  
  2. #define CYCLES  10                                                          
  3. //#define RESOLUTION  F_CPU / CYCLES /‭ 2^24 = 0.09536743732496
  4. #define RESOLUTION  0.09536743732496
  5.  
  6.  
  7.  
  8. // ASM
  9. void static inline Signal_OUT(const uint8_t *, uint8_t, uint8_t, uint8_t);
  10.  
  11.  
  12. struct signal{
  13.     volatile uint8_t    mode;           //signal
  14.     volatile uint8_t    fr1;            //Frequency [0..7]
  15.     volatile uint8_t    fr2;            //Frequency [8..15]
  16.     volatile uint8_t    fr3;            //Frequency [16..31]
  17.     volatile uint32_t   freq;           //frequency value
  18.     volatile uint8_t    flag;           //if "0"generator is OFF, "1" - ON
  19.     volatile uint32_t   acc;            //accumulator
  20.     volatile uint8_t    ON;
  21.     volatile uint8_t    HSfreq;         //high speed frequency [1...4Mhz]
  22.     volatile uint32_t   deltafreq;      //frequency step value
  23. } SG;
  24.  
  25. //const uint8_t  sinewave[] __attribute__ ((section (".MySection1"))) = {
  26. static const uint8_t sinewave[] PROGMEM = {
  27.     0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
  28.     0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,
  29.     0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf5,
  30.     0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,
  31.     0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,
  32.     0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc,
  33.     0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3,
  34.     0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x98,0x95,0x92,0x8f,0x8c,0x89,0x86,0x83,
  35.     0x80,0x7c,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51,
  36.     0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,
  37.     0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x0a,
  38.     0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,
  39.     0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08,
  40.     0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23,
  41.     0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c,
  42.     0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c
  43. };
  44.  
  45. const uint8_t *SIGNALS[] = {
  46.     sinewave
  47. };
  48.  
  49. void static inline Signal_OUT(const uint8_t *signal, uint8_t ad2, uint8_t ad1, uint8_t ad0)
  50. {
  51.     asm volatile(  
  52.         "eor r18, r18   ;r18<-0"    "\n\t"
  53.         "eor r19, r19   ;r19<-0"    "\n\t"
  54.         "1:"                        "\n\t"
  55.         "add r18, %0    ;1 cycle"           "\n\t"
  56.         "adc r19, %1    ;1 cycle"           "\n\t" 
  57.         "adc %A3, %2    ;1 cycle"           "\n\t"
  58.         "lpm            ;3 cycles"  "\n\t"
  59.         "out %4, r0     ;1 cycle"   "\n\t"
  60.         "sbis %5, 2     ;1 cycle if no skip" "\n\t"
  61.         "rjmp 1b        ;2 cycles. Total 10 cycles" "\n\t"
  62.         :
  63.         :"r" (ad0),"r" (ad1),"r" (ad2),"e" (signal),"I" (_SFR_IO_ADDR(PORTA)), "I" (_SFR_IO_ADDR(SPCR0))
  64.         :"r18", "r19"
  65.     );
  66. }
  67.  
  68.  
  69. // --------------------
  70.     SG.fr1  = 0xe8;    
  71.     SG.fr2  = 0x03;    
  72.     SG.fr3  = 0x00;
  73.    
  74.     SG.freq=( ((uint32_t)(SG.fr3)<<16) | ((uint32_t)(SG.fr2)<<8) | ((uint32_t)(SG.fr1)) );
  75.  
  76.     SG.acc = SG.freq / RESOLUTION;
  77.     Signal_OUT(SIGNALS[SG.mode], (SG.acc >> 16), (SG.acc >> 8), SG.acc);
  78.  
  79.  
  80.  
  81. // ERRORS
  82.  
  83. Compiling C: main.c
  84. avr-gcc -c -mmcu=atmega324p -I. -gdwarf-2 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./main.lst  -std=gnu99 -Wundef -MMD -MP -MF .dep/main.o.d main.c -o main.o
  85. /tmp/ccCDmZHO.s: Assembler messages:
  86. /tmp/ccCDmZHO.s:317: Error: number must be positive and less than 32
  87. Makefile:579: recipe for target 'main.o' failed
  88. make: *** [main.o] Error 1
Add Comment
Please, Sign In to add comment